<?php
setcookie("username","海威",time()+3600);
session_start();

$cars = array
  (
  array("Volvo",22,18),
  array("BMW",15,13),
  array("Saab",5,2),
  array("Land Rover",17,15)
  );
  
	for ($row = 0; $row <  count($cars); $row++) {
   echo "<p><b>行数 $row</b></p>";
   echo "<ul>";
   for ($col = 0; $col <  count($cars[$row]); $col++) {
     echo "<li>".$cars[$row][$col]."</li>";
   }
   echo "</ul>";
}
  ?>
  
  <?php
echo "今天是 " . date("Y/m/d") . "<br>";
echo "今天是 " . date("Y.m.d") . "<br>";
echo "今天是 " . date("Y-m-d") . "<br>";
echo "今天是 " . date("l") . "<br>";
?>

<?php
date_default_timezone_set("Asia/Shanghai");
echo "当前时间是 " . date("h:i:sa");
?>

<?php 
echo "<br>";
include 'include.php';
echo "我有一辆{$color}{$car}<br>";
?>

<?php 
echo "<br>";
$myfile = fopen("file.txt", "r") or die("无法打开该文件");
//整批读取
echo fread($myfile, filesize("file.txt"))."<br>";
$myfile = fopen("file.txt", "r") or die("无法打开该文件");
//按行读取
echo fgets($myfile)."<br>";
$myfile = fopen("file.txt", "r") or die("无法打开该文件");
while(!feof($myfile)) {
	//按行读取
	echo fgets($myfile);
}
echo "<br>";
$myfile = fopen("file.txt", "r") or die("无法打开该文件");
while (!feof($myfile)) {
	//按字符读取
	echo fgetc($myfile);
}
fclose($myfile);
echo "<br>";
echo readfile("file.txt");
?>

<?php 
echo "<br>";
//无法追加，只能覆盖原文件内容
$myfile = fopen("create.txt", "w") or die("无法创建文件");
$txtcontent = "name:heaven\n";
fwrite($myfile, $txtcontent);
$txtcontent = "age:23";
fwrite($myfile, $txtcontent);
fclose($myfile);
?>


<form action=<?php echo $_SERVER["PHP_SELF"]?> method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" /> 
<br />
<input type="text" name="name" />
<br>
<input type="submit" name="submit" value="Submit" />
</form>

<?php

/*
UPLOAD_ERR_OK 值：0; 没有错误发生，文件上传成功

UPLOAD_ERR_INI_SIZE 值：1; 上传的文件超过了 php.ini 中 upload_max_filesize选项限制的值           

UPLOAD_ERR_FORM_SIZE 值：2;上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值       

UPLOAD_ERR_PARTIAL 值：3; 文件只有部分被上传                 

UPLOAD_ERR_NO_FILE 值：4;没有文件被上传

 值：5; 上传文件大小为0    
 
Q:文件上传的时候文件名是乱码，如何解决?
A:网页文件编码没有设置成utf-8
*/


if ($_FILES["file"]["size"] < 40000)
{
	if ($_FILES["file"]["error"] > 0)
	{
		echo "Error: " . $_FILES["file"]["error"] . "<br />";
	}
	else
	{
		echo "Upload: " . $_FILES["file"]["name"] . "<br />";
		echo "Type: " . $_FILES["file"]["type"] . "<br />";
		echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
		echo "Stored in: " . $_FILES["file"]["tmp_name"];

	 if (file_exists("upload/" . $_FILES["file"]["name"]))
	 {
	 	echo $_FILES["file"]["name"] . " already exists. ";
	 }
	 else
	 {
	 	move_uploaded_file($_FILES["file"]["tmp_name"],"upload/" . $_FILES["file"]["name"]);
	 	echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
	 }
	}
}else{
	echo "Invalid file";
}
echo $_POST["name"];
?>


<?php 
/*
 * setcookie() 函数必须位于 <html> 标签之前。
 */
echo "<br>";

echo $_COOKIE["username"]."<br>";
print_r($_COOKIE);
echo "<br>";
$cookies = $_COOKIE;
foreach ($cookies as $v=>$value) {
	echo "{$v}=>{$value}.<br>";
}
?>

<?php 
/*
 * 使用 isset() 函数来确认是否已设置了 cookie：
 */
if (isset($_COOKIE["username"])){
	echo "welcome {$_COOKIE["username"]}";
}else {
	echo "welcome guest!";
}
?>

<?php 
/*
 * 删除 cookie
 */
echo "<br>";
//setcookie("username","",time()-3600);
print_r($_COOKIE);
/*
 * Session 的工作机制是：为每个访问者创建一个唯一的 id (UID)，并基于这个 UID 来存储变量。
 * UID 存储在 cookie 中，亦或通过 URL 进行传导。
 * Q:那么如果我将其保存在本地的cookie删除是不是就可以销毁这个session UID，
 * 从而浏览器重新生成一个session UID了呢？
 * A：不是
 */
setcookie("PHPSESSID","",time()-3600);
echo "<br>";
print_r($_COOKIE);
?>

<?php 
/*
 * session_start() 函数必须位于 <html> 标签之前：
 */
echo "<br>";
$_SESSION["username"]="海威";
echo "hello {$_SESSION["username"]}!";
?>

<?php
/*
 * 简单的 page-view 计数器
 */ 
echo "<br>";
if (isset($_SESSION["username"])){
	$_SESSION["username"] .= "_Zhang";
}
else {
	$_SESSION["username"] = "no define";
}
echo "hi {$_SESSION["username"]}";
?>

<?php 
/*
 * unset() 函数用于释放指定的 session 变量：
 * session_destroy() 函数彻底终结 session：
 */
echo "<br>";
unset($_SESSION["username"]);
if (isset($_SESSION["username"]))
echo $_SESSION["username"]."<br>";
else 
echo "不存在username session"."<br>";
session_destroy();
?>


<?php
/*
 * 发送邮件
 */
function spamcheck($field)
  {
  //filter_var() sanitizes the e-mail 
  //address using FILTER_SANITIZE_EMAIL
  $field=filter_var($field, FILTER_SANITIZE_EMAIL);
  
  //filter_var() validates the e-mail
  //address using FILTER_VALIDATE_EMAIL
  if(filter_var($field, FILTER_VALIDATE_EMAIL))
    {
    return TRUE;
    }
  else
    {
    return FALSE;
    }
  }
  
if (isset($_REQUEST['email']))
  {//if "email" is filled out, proceed

  //check if the email address is invalid
  $mailcheck = spamcheck($_REQUEST['email']);
  if ($mailcheck==FALSE)
    {
    echo "Invalid input";
    }
  else
    {//send email
    $email = $_REQUEST['email'] ; 
    $subject = $_REQUEST['subject'] ;
    $message = $_REQUEST['message'] ;
    mail("someone@example.com", "Subject: $subject",
    $message, "From: $email" );
    echo "Thank you for using our mail form";
    }
  }
else
//if "email" is not filled out, display the form
  {
  echo "<form method='post' action='".$_SERVER["PHP_SELF"]."'>
  Email: <input name='email' type='text' /><br />
  Subject: <input name='subject' type='text' /><br />
  Message:<br />
  <textarea name='message' rows='15' cols='40'>
  </textarea><br />
  <input type='submit' />
  </form>";
  }
?>


<?php
/*
 * 错误处理
 */

/*
 * die处理基本错误
 */
/*
if(!file_exists("welcome.txt"))
 {
 die("找不到该文件");
 }
else
 {
 $file=fopen("welcome.txt","r");
 }
 //不会往下运行下去
  */
 
/*
 * 用户自定义错误
 */
 echo "<br>";
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Error:</b> [错误报告级别:$errno] $errstr";
 }

//set error handler
set_error_handler("customError");

//trigger error
echo($test);
//能够继续往下运行
 echo "<br>能够继续往下运行";

/*
 * 触发错误
 */
echo "<br>";
$test=2;
if ($test>1)
{
trigger_error("Value must be 1 or below");
}
echo "<br>能够继续往下运行";


echo "<br>";
//error handler function
function customError2($errno, $errstr)
 { 
 echo "<b>Error:</b> [错误报告级别:$errno] $errstr<br />";
 echo "开始记录错误....";
 /*
  * 设置错误应该发送到何处。可能的信息类型有以下几个： 
error_log() 日志类型 0 message 发送到 PHP 的系统日志，使用 操作系统的日志机制或者一个文件，取决于 error_log 指令设置了什么。 这是个默认的选项。  
1 message 发送到参数 destination 设置的邮件地址。 第四个参数 extra_headers 只有在这个类型里才会被用到。  
2 不再是一个选项。  
3 message 指定位置：被发送到位置为 destination 的文件里。 字符 message 不会默认被当做新的一行。  
4 message 直接发送到 SAPI 的日志处理程序中。  
  */
// 调用 error_log() 的另一种方式:内容为追加
error_log("You messed up!\n", 3, "my-errors.log");
 
// die();//die函数使得代码不能继续往下执行
 }

//set error handler
set_error_handler("customError2",E_USER_WARNING);

//trigger error
$test=2;
echo $test."<br>";
if ($test>1)
 {
 trigger_error("Value must be 1 or below",E_USER_WARNING);
 }
 echo "<br>能够继续往下运行";
?>


<?php
/*
 * 基本异常
 */
/*
echo "<br>";
//create function with an exception
function checkNum($number)
 {
 if($number>1)
  {
  throw new Exception("Value must be 1 or below");
  }
 return true;
 }

//trigger exception
checkNum(2);
//不会往下运行下去
 */
?>


<?php
/*
 * Q:出现那种错误(异常)代码将无法继续运行下去，而出现哪种错误(异常)代码仍然可以继续运行下去
 * A:
 * 代码无法继续运行下去的错误(异常)有：
 * 1、die处理基本错误
 * 2、基本异常
 * 代码可以继续运行下去的错误(异常)有：
 * 1、用户自定义错误
 * 2、触发错误
 * 3、创建可抛出一个异常的函数
 */
/*
 * 创建可抛出一个异常的函数
 */
echo "<br>";
function checkNum2($number)
 {
 if($number>1)
  {
  throw new Exception("Value must be 1 or below");
  }
 return true;
 }

//在 "try" 代码块中触发异常
try
 {
 checkNum2(2);
 //If the exception is thrown, this text will not be shown
 echo 'If you see this, the number is 1 or below';
 }
//捕获异常
catch(Exception $e)
 {
 echo 'Message: ' .$e->getLine().$e->getMessage();
 }
 echo "<br>能够继续往下运行";
?>

<?php 
/*
 * Q:try是代码块，定义一个全局变量，在try代码块中可以调用，所以这么说，全局变量只有在函数之内无法调用是吗？
 * A：是的。
 */
echo "<br>";
$email = "someone@example...com";
try {
	echo $email;
} catch(Exception $e) {
	
}
?>

<?php
/*
 * 创建一个自定义的 Exception 类
 */
echo "<br>";
class customException extends Exception
 {
 public function errorMessage()
  {
  //error message
  $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
  .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
  return $errorMsg;
  }
 }

$email = "someone@example...com";

try
 {
 //check if 
 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
  {
  //throw exception if email is not valid
  throw new customException($email);
  }
 }

catch (customException $e)
 {
 //display custom message
 echo $e->errorMessage();
 }
  echo "<br>能够继续往下运行";
?>


<?php
/*
 * 抛出多个异常
 */
echo "<br>";
class customsException extends Exception
{
	public function errorMessage()
	{
		//error message
		$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
		.': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
		return $errorMsg;
	}
}

$email = "someone@example.com";

try
{
	//check if
	if(filter_var($email, FILTER_VALIDATE_EMAIL) !== FALSE)
	{
		//throw exception if email is not valid
		throw new customsException($email);
	}
	echo "再抛出一个异常";
	//check for "example" in mail address
	if(strpos($email, "example") !== FALSE)
	{
		throw new Exception("$email is an example e-mail");
	}
}

catch (customsException $e)
{
	echo $e->errorMessage();
}

catch(Exception $e)
{
	echo $e->getMessage();
}
?>


<?php
/*
 * 重新抛出异常
 */
echo "<br>";
class custom3Exception extends Exception
 {
 public function errorMessage()
  {
  //error message
  $errorMsg = $this->getMessage().'不是一个正常的邮件地址';
  return $errorMsg;
  }
 }

$email = "someone@example.com";

try
 {
 try
  {
  //check for "example" in mail address
  if(strpos($email, "example") !== FALSE)
   {
   //throw exception if email is not valid
   throw new Exception($email);
   }
  }
 catch(Exception $e)
  {
  //re-throw exception
  throw new custom3Exception($email);
  }
 }

catch (custom3Exception $e)
 {
 //display custom message
 echo $e->errorMessage();
 }
?>

<?php
/*
 * 设置顶层异常处理器
 */
/*
echo "<br>";
function myException($exception)
{
echo "<b>Exception:</b> " , $exception->getMessage();
}

set_exception_handler('myException');

throw new Exception('Uncaught Exception occurred');
//不会往下运行下去
 */
?>

<?php 
/*
 * 过滤器，需更详细学习
 */
echo "<br>";
$int = 123;

if(!filter_var($int, FILTER_VALIDATE_INT))
 {
 echo("这不是一个整型");
 }
else
 {
 echo("这是一个整型");
 }
?>

<?php
echo "<br>";
$var=300;

$int_options = array
(
	"options"=>array
		(
		 "min_range"=>0,
		 "max_range"=>256
		)
);

if(!filter_var($var, FILTER_VALIDATE_INT, $int_options))
 {
 echo("Integer is not valid");
 }
else
 {
 echo("Integer is valid");
 }
?>


<?php
/*
 * 验证输入  Validating 过滤器：
 */
echo "<br>";
//检测是否存在 "GET" 类型的 "email" 输入变量
if(!filter_has_var(INPUT_POST, "email"))
 {
 echo("email 还没有输入值");
 }
else
 {
 	//如果存在输入变量，检测它是否是有效的邮件地址
 if (!filter_input(INPUT_POST, "email", FILTER_VALIDATE_EMAIL))
  {
  echo "E-Mail 无效";
  }
 else
  {
  echo "E-Mail 有效";
  }
 }
?>

<?php
/*
 * 净化输入  Sanitizing 过滤器：
 */
echo "<br>";
$myurl = "http://www.W3非o法ol.com.c字符n/";
if(!filter_has_var(INPUT_POST, "url"))
 {
 echo("url 还没有输入值");
 }
else
 {
 $url = filter_input(INPUT_POST, "url", FILTER_SANITIZE_URL);
 }
?>

<?php
echo "<br>";
function convertSpace($string)
{
return str_replace("_", " ", $string);
}

$string = "Peter_is_a_great_guy!";

echo filter_var($string, FILTER_CALLBACK, array("options"=>"convertSpace"));
?>







